package com.example.pdftomarkdown.service;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

/**
 * Markdown转换服务类
 * 负责将PDF提取的文本转换为规范的Markdown格式
 */
@Service
public class MarkdownConverterService {
    
    private static final Pattern URL_PATTERN = Pattern.compile("(https?://[\\w\\-._~:/?#\\[\\]@!$&'()*+,;=%]+)");
    private static final Pattern EMAIL_PATTERN = Pattern.compile("\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b");
    private static final Pattern BULLET_PATTERN = Pattern.compile("^[•·▪▫‣⁃]\\s+");
    private static final Pattern NUMBER_LIST_PATTERN = Pattern.compile("^\\d+[.):]\\s+");
    
    /**
     * 将PDF提取的文本转换为Markdown格式
     * 
     * @param pdfText 从PDF提取的原始文本
     * @param filename 原始文件名
     * @return 格式化的Markdown文本
     */
    public String convertToMarkdown(String pdfText, String filename) {
        if (StringUtils.isBlank(pdfText)) {
            return generateEmptyMarkdown(filename);
        }
        
        StringBuilder markdown = new StringBuilder();
        
        // 添加文档头部信息
        markdown.append(generateMarkdownHeader(filename));
        
        // 处理文本内容
        String processedContent = processContent(pdfText);
        markdown.append(processedContent);
        
        // 添加文档尾部信息
        markdown.append(generateMarkdownFooter());
        
        return markdown.toString();
    }
    
    /**
     * 生成Markdown文档头部
     * 
     * @param filename 原始文件名
     * @return Markdown头部内容
     */
    private String generateMarkdownHeader(String filename) {
        String title = extractTitleFromFilename(filename);
        String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        
        return "# " + title + "\n\n" +
                "> **文档信息**\n" +
                "> - 原始文件: " + filename + "\n" +
                "> - 转换时间: " + currentTime + "\n" +
                "> - 转换工具: PDF转Markdown转换器\n\n" +
                "---\n\n";
    }
    
    /**
     * 处理文档主体内容
     * 
     * @param content 原始内容
     * @return 处理后的Markdown内容
     */
    private String processContent(String content) {
        String[] paragraphs = content.split("\n\n");
        StringBuilder result = new StringBuilder();
        
        for (String paragraph : paragraphs) {
            String processedParagraph = processParagraph(paragraph.trim());
            if (!processedParagraph.isEmpty()) {
                result.append(processedParagraph).append("\n\n");
            }
        }
        
        return result.toString();
    }
    
    /**
     * 处理单个段落
     * 
     * @param paragraph 原始段落
     * @return 处理后的段落
     */
    private String processParagraph(String paragraph) {
        if (StringUtils.isBlank(paragraph)) {
            return "";
        }
        
        // 处理页面分隔符
        if ("---".equals(paragraph.trim())) {
            return "\n---\n";
        }
        
        String[] lines = paragraph.split("\n");
        StringBuilder processedParagraph = new StringBuilder();
        
        for (String line : lines) {
            String trimmedLine = line.trim();
            if (trimmedLine.isEmpty()) {
                continue;
            }
            
            // 处理列表项
            if (isBulletPoint(trimmedLine)) {
                processedParagraph.append(formatBulletPoint(trimmedLine)).append("\n");
            } else if (isNumberedList(trimmedLine)) {
                processedParagraph.append(formatNumberedList(trimmedLine)).append("\n");
            }
            // 处理已有的标题标记
            else if (trimmedLine.startsWith("#")) {
                processedParagraph.append(trimmedLine).append("\n");
            }
            // 处理普通文本
            else {
                String formattedLine = formatInlineElements(trimmedLine);
                processedParagraph.append(formattedLine).append(" ");
            }
        }
        
        return processedParagraph.toString().trim();
    }
    
    /**
     * 格式化行内元素（链接、邮箱等）
     * 
     * @param text 原始文本
     * @return 格式化后的文本
     */
    private String formatInlineElements(String text) {
        // 处理URL链接
        text = URL_PATTERN.matcher(text).replaceAll("[$0]($0)");
        
        // 处理邮箱
        text = EMAIL_PATTERN.matcher(text).replaceAll("[$0](mailto:$0)");
        
        // 处理粗体文本（连续大写字母）
        text = text.replaceAll("\\b([A-Z]{3,})\\b", "**$1**");
        
        return text;
    }
    
    /**
     * 判断是否为项目符号列表
     */
    private boolean isBulletPoint(String line) {
        return BULLET_PATTERN.matcher(line).find() || 
               line.startsWith("- ") || 
               line.startsWith("* ");
    }
    
    /**
     * 判断是否为编号列表
     */
    private boolean isNumberedList(String line) {
        return NUMBER_LIST_PATTERN.matcher(line).find();
    }
    
    /**
     * 格式化项目符号列表
     */
    private String formatBulletPoint(String line) {
        // 统一使用 "- " 作为项目符号
        return BULLET_PATTERN.matcher(line).replaceFirst("- ");
    }
    
    /**
     * 格式化编号列表
     */
    private String formatNumberedList(String line) {
        // 保持编号格式，但统一使用 ". " 分隔符
        java.util.regex.Matcher matcher = NUMBER_LIST_PATTERN.matcher(line);
        if (matcher.find()) {
            String number = matcher.group().replaceAll("[.):]+\\s*$", "");
            return matcher.replaceFirst(number + ". ");
        }
        return line;
    }
    
    /**
     * 从文件名提取标题
     * 
     * @param filename 原始文件名
     * @return 提取的标题
     */
    private String extractTitleFromFilename(String filename) {
        if (StringUtils.isBlank(filename)) {
            return "未命名文档";
        }
        
        // 移除文件扩展名
        String title = filename.replaceAll("\\.[pP][dD][fF]$", "");
        
        // 处理常见的文件名格式
        title = title.replaceAll("[_-]", " ");
        title = title.replaceAll("\\s+", " ");
        
        return StringUtils.capitalize(title.trim());
    }
    
    /**
     * 生成空文档的Markdown
     */
    private String generateEmptyMarkdown(String filename) {
        return generateMarkdownHeader(filename) + 
               "\n> **注意**: 该PDF文件未能提取到有效文本内容。\n" +
               "> 可能的原因：\n" +
               "> - 文件为扫描版PDF（图片格式）\n" +
               "> - 文件已加密\n" +
               "> - 文件损坏\n\n" +
               generateMarkdownFooter();
    }
    
    /**
     * 生成文档尾部
     */
    private String generateMarkdownFooter() {
        return "\n---\n\n*本文档由PDF转Markdown转换器自动生成*\n";
    }
}